home *** CD-ROM | disk | FTP | other *** search
/ Aminet 46 / Aminet 46 (2001)(GTI - Schatztruhe)[!][Dec 2001].iso / Aminet / text / edit / edt10src.lha / txt / Files.mod < prev    next >
Text File  |  1995-04-08  |  6KB  |  277 lines

  1. (*
  2.   .name       Files
  3.   .task       file management
  4.   .release    1.0
  5.   .language   Oberon-2
  6.   .translator Amiga Oberon 3.11
  7.   .system     AmigaOS 2.04/2.1/3.0
  8.   .author     Joachim Barheine
  9.   .address    Hochgrevestraße 3, D-38640 Goslar
  10.   .copyright  (c) 1994 by Joachim Barheine
  11. *)
  12.  
  13. (* .info: 13/08/94, 14:28:53, version 19 *)
  14.  
  15. MODULE Files;
  16.  
  17. IMPORT
  18.   SYS:= SYSTEM,
  19.  
  20.   ASCII,
  21.   Dos,
  22.   Exec,
  23.   K:= Kernel,
  24.   S:= Strings,
  25.   Sett:= Settings,
  26.   Str:= StrPool;
  27.  
  28. CONST
  29.   nameLen* = 31;
  30.   pathLen* = 256;
  31.   filenameLen* = pathLen + nameLen;
  32.  
  33. TYPE
  34.   File* = RECORD
  35.     lock: Dos.FileLockPtr;
  36.     fh: Dos.FileHandlePtr;
  37.     prot: LONGSET;
  38.     write- : BOOLEAN;       (* read/write *)
  39.     len-, err- : LONGINT;   (* current length of file, Dos error-code *)
  40.     pos- : LONGINT;         (* current position *)
  41.     done- : BOOLEAN;        (* status *)
  42.   END;
  43.  
  44. VAR
  45.   cnt: INTEGER;
  46.  
  47. (* create a filename (for unnamed texts) *)
  48. PROCEDURE CreateName* (VAR name: ARRAY OF CHAR);
  49.  
  50. VAR
  51.   a: ARRAY 1 OF LONGINT;
  52.  
  53. BEGIN
  54.   a[0]:= cnt; INC(cnt);
  55.   K.FormatString(name, Str.unnamedN^, a);
  56. END CreateName;
  57.  
  58. (* path from filename *)
  59. PROCEDURE GetPath* (VAR path: ARRAY OF CHAR; filename: ARRAY OF CHAR);
  60.  
  61. VAR
  62.   i, last: INTEGER;
  63.  
  64. (* $CopyArrays- *)
  65.  
  66. BEGIN
  67.   last:= -1; i:= 0;
  68.   WHILE filename[i] # ASCII.nul DO
  69.     IF filename[i] = ":" THEN last:= i ELSIF filename[i] = "/" THEN last:= i - 1 END;
  70.     path[i]:= filename[i];
  71.     INC(i);
  72.   END;
  73.   path[i]:= ASCII.nul;
  74.   path[last + 1]:= ASCII.nul;
  75. END GetPath;
  76.  
  77. (* name from filename *)
  78. PROCEDURE GetName* (VAR name: ARRAY OF CHAR; filename: ARRAY OF CHAR);
  79.  
  80. VAR
  81.   str: Exec.LSTRPTR;
  82.  
  83. (* $CopyArrays- *)
  84.  
  85. BEGIN
  86.   str:= Dos.FilePart(filename);
  87.   IF str # NIL THEN COPY(str^, name) ELSE name:= "$Ohne_Namen.txt" END;
  88. END GetName;
  89.  
  90. PROCEDURE GetFilename* (VAR filename: ARRAY OF CHAR; path, name: ARRAY OF CHAR);
  91.  
  92. (* $CopyArrays- *)
  93.  
  94. BEGIN
  95.   COPY(path, filename);
  96.   IF ~Dos.AddPart(filename, name, LEN(filename)) THEN filename:= "$Ohne_Namen" END;
  97. END GetFilename;
  98.  
  99. PROCEDURE Exists* (filename: ARRAY OF CHAR): BOOLEAN;
  100.  
  101. VAR
  102.   lock: Dos.FileLockPtr;
  103.  
  104. (* $CopyArrays- *)
  105.  
  106. BEGIN
  107.   lock:= Dos.Lock(filename, Dos.sharedLock);
  108.   IF lock # NIL THEN
  109.     Dos.UnLock(lock);
  110.     RETURN TRUE;
  111.   ELSE
  112.     RETURN FALSE;
  113.   END;
  114. END Exists;
  115.  
  116. (* File methods: *)
  117. PROCEDURE (VAR f: File) Open* (filename: ARRAY OF CHAR; write: BOOLEAN): BOOLEAN;
  118.  
  119. VAR
  120.   fib: Dos.FileInfoBlockPtr;
  121.   new: BOOLEAN;
  122.  
  123.   PROCEDURE Backup(file: ARRAY OF CHAR): BOOLEAN;
  124.  
  125.   VAR
  126.     i: INTEGER;
  127.     backup: ARRAY 300 OF CHAR;
  128.  
  129.   (* $CopyArrays- *)
  130.  
  131.   BEGIN
  132.     COPY(file, backup);
  133.     i:= SHORT(S.Length(file));
  134.     IF (i >= 3) & (file[i-2] = "$") THEN
  135.       IF (file[i-1] >= "0") & (file[i-1] < "9") THEN
  136.         IF ORD(file[i-1]) - ORD("0") + 1 >= Sett.backups THEN
  137.           RETURN Dos.DeleteFile(file);
  138.         ELSE
  139.           backup[i-1]:= CHR(ORD(file[i-1]) + 1);
  140.         END;
  141.       ELSE
  142.         RETURN TRUE;  (* temporary file: auto-save, ... *)
  143.       END;
  144.     ELSE
  145.       S.Append(backup, "$0");
  146.     END;
  147.     RETURN (~Exists(backup) OR Backup(backup)) & Dos.Rename(file, backup);
  148.   END Backup;
  149.  
  150. (* $CopyArrays- *)
  151.  
  152. BEGIN
  153.   f.pos:= 0;
  154.   f.write:= write;
  155.   new:= ~Exists(filename);
  156.   IF write THEN
  157.     f.prot:= LONGSET{Dos.execute};
  158.     f.len:= 0;
  159.     IF ~new THEN
  160.       f.lock:= Dos.Lock(filename, Dos.sharedLock);
  161.       IF f.lock # NIL THEN
  162.         NEW(fib);
  163.         IF Dos.Examine(f.lock, fib^) THEN f.prot:= fib.protection END;
  164.         DISPOSE(fib);
  165.         Dos.UnLock(f.lock); f.lock:= NIL;
  166.       END;
  167.     END;
  168.     IF ~new & (Sett.backups # Sett.backupsOff) & ~Backup(filename) THEN RETURN FALSE END;
  169.     f.fh:= Dos.Open(filename, Dos.newFile);
  170.     f.done:= f.fh # NIL;
  171.   ELSE
  172.     f.lock:= Dos.Lock(filename, Dos.sharedLock);
  173.     f.done:= f.lock # NIL;
  174.     IF f.done THEN
  175.       NEW(fib);
  176.       f.done:= Dos.Examine(f.lock, fib^);
  177.       IF f.done THEN
  178.         f.len:= fib.size;
  179.         f.prot:= fib.protection;
  180.         f.fh:= Dos.OpenFromLock(f.lock);
  181.         f.done:= f.fh # NIL;
  182.         IF ~f.done THEN Dos.UnLock(f.lock) END;
  183.       ELSE
  184.         Dos.UnLock(f.lock);
  185.       END;
  186.       DISPOSE(fib);
  187.     END;
  188.   END;
  189.   IF ~f.done THEN f.err:= Dos.IoErr() END;
  190.   RETURN f.done;
  191. END Open;
  192.  
  193. PROCEDURE (VAR f: File) Close*;
  194.  
  195. VAR
  196.   name: UNTRACED POINTER TO ARRAY 256 OF CHAR;
  197.  
  198.   PROCEDURE Close;
  199.  
  200.   VAR
  201.     i: INTEGER;
  202.  
  203.   BEGIN
  204.     FOR i:= 0 TO 4 DO  (* timeout 5 secs. *)
  205.       IF Dos.Close(f.fh) THEN RETURN END;
  206.       Dos.Delay(50);
  207.     END;
  208.   END Close;
  209.  
  210. BEGIN
  211.   f.done:= TRUE;
  212.   IF f.write THEN
  213.     NEW(name);
  214.     IF Dos.NameFromFH(f.fh, name^, LEN(name^)) THEN
  215.       Close;
  216.       IF Dos.SetProtection(name^, f.prot + LONGSET{Dos.execute}) THEN END;
  217.     ELSE
  218.       Close;
  219.     END;
  220.     DISPOSE(name);
  221.     RETURN;
  222.   END;
  223.   Close;
  224.   IF ~f.write THEN Dos.UnLock(f.lock) END;
  225. END Close;
  226.  
  227. PROCEDURE (VAR f: File) Read* (VAR str: ARRAY OF SYS.BYTE; len: LONGINT);
  228.  
  229. VAR
  230.   l: LONGINT;
  231.  
  232. BEGIN
  233.   IF f.done THEN
  234.     l:= Dos.Read(f.fh, str, len);
  235.     INC(f.pos, l);
  236.     f.done:= l = len;
  237.     IF ~f.done THEN f.err:= Dos.IoErr() END;
  238.   END;
  239. END Read;
  240.  
  241. PROCEDURE (VAR f: File) Write* (str: ARRAY OF SYS.BYTE; len: LONGINT);
  242.  
  243. VAR
  244.   l: LONGINT;
  245.  
  246. (* $CopyArrays- *)
  247.  
  248. BEGIN
  249.   IF f.done THEN
  250.     l:= Dos.Write(f.fh, str, len);
  251.     INC(f.len, l); INC(f.pos, l);
  252.     f.done:= l = len;
  253.     IF ~f.done THEN f.err:= Dos.IoErr() END;
  254.   END;
  255. END Write;
  256.  
  257. PROCEDURE (VAR f: File) WriteFrom* (str: ARRAY OF SYS.BYTE; from, len: LONGINT);
  258.  
  259. VAR
  260.   l: LONGINT;
  261.   tricky: Exec.LSTRPTR;
  262.  
  263. (* $CopyArrays- *)
  264.  
  265. BEGIN
  266.   IF f.done THEN
  267.     tricky:= SYS.VAL(Exec.LSTRPTR, SYS.VAL(LONGINT, SYS.ADR(str)) + from);
  268.     l:= Dos.Write(f.fh, tricky^, len);
  269.     INC(f.len, l); INC(f.pos, l);
  270.     f.done:= l = len;
  271.     IF ~f.done THEN f.err:= Dos.IoErr() END;
  272.   END;
  273. END WriteFrom;
  274.  
  275. BEGIN
  276.   cnt:= 0;
  277. END Files.